package com.danciyixue.boot.dcyx.service;

import com.danciyixue.boot.client.test.model.PreTestSaveRequest;
import com.danciyixue.boot.client.testRecord.model.TestRecordSaveRequest;
import com.danciyixue.boot.dcyx.model.entity.TestRecords;
import com.danciyixue.boot.dcyx.model.form.TestRecordsForm;
import com.danciyixue.boot.dcyx.model.query.TestRecordsQuery;
import com.danciyixue.boot.dcyx.model.vo.TestRecordsVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * 测试结果记录服务类
 *
 * @author youlaitech
 * @since 2025-06-15 16:31
 */
public interface TestRecordsService extends IService<TestRecords> {

    /**
     *测试结果记录分页列表
     *
     * @return {@link IPage<TestRecordsVO>} 测试结果记录分页列表
     */
    IPage<TestRecordsVO> getTestRecordsPage(TestRecordsQuery queryParams);

    /**
     * 获取测试结果记录表单数据
     *
     * @param id 测试结果记录ID
     * @return 测试结果记录表单数据
     */
     TestRecordsForm getTestRecordsFormData(Long id);

    /**
     * 新增测试结果记录
     *
     * @param formData 测试结果记录表单对象
     * @return 是否新增成功
     */
    boolean saveTestRecords(TestRecordsForm formData);

    /**
     * 修改测试结果记录
     *
     * @param id   测试结果记录ID
     * @param formData 测试结果记录表单对象
     * @return 是否修改成功
     */
    boolean updateTestRecords(Long id, TestRecordsForm formData);

    /**
     * 删除测试结果记录
     *
     * @param ids 测试结果记录ID，多个以英文逗号(,)分割
     * @return 是否删除成功
     */
    boolean deleteTestRecordss(String ids);

    /**
     * 检查用户是否已完成指定教材的学前测试
     *
     * @param userId 用户ID
     * @param programId 教材ID
     * @return 是否已完成学前测试
     */
    boolean hasCompletedPreTest(Long userId, Long programId);

    /**
     * 通过教材ID查询测试记录VO
     *
     * @param programId 教材ID
     * @return 测试记录VO对象，如果未完成测试则返回null
     */
    TestRecordsVO getTestRecordsByProgramId(Long programId);

    /**
     * 保存学前测试记录
     *
     * @param request 学前测试保存请求对象
     * @return 是否保存成功
     */
    boolean savePreTestRecord(PreTestSaveRequest request);

    /**
     * 保存测试记录信息
     *
     * @param request 测试记录保存请求对象
     * @return 是否保存成功
     */
    boolean saveTestRecord(TestRecordSaveRequest request);

    /**
     * 根据教材ID查询用户的测试记录列表
     *
     * @param programId 教材ID
     * @return 测试记录列表，包含单词拼写信息
     */
    List<TestRecordsVO> getTestRecordsListByProgramId(Long programId);

}
